package com.sz.common.core.system.service.impl;

import com.sz.common.base.dao.DaoSupport;
import com.sz.common.core.constants.UserConfigKeys;
import com.sz.common.core.system.dto.UserConfigDto;
import com.sz.common.core.system.entity.UserConfig;
import com.sz.common.core.system.service.UserConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * Function: UserConfigServiceImpl <br>
 * Author: wentao.chang <br>
 * Date: 2016-11-09 15:10:00
 */
@Service
public class UserConfigServiceImpl implements UserConfigService {

    @Autowired
    private DaoSupport dao;

    /**
     * 保存用户的个性化设置 自动判断新增还是更新
     *
     * @see UserConfigService#saveUserConfig(UserConfigDto)
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void saveUserConfig(UserConfigDto userConfigDto) {
        if (StringUtils.hasLength(userConfigDto.getI18n())) {
            UserConfig uc = new UserConfig();
            uc.setUserId(userConfigDto.getUserId());
            uc.setParamName(UserConfigKeys.KEY_I18N);
            uc.setParamValue(userConfigDto.getI18n());
            saveOrUpdate(uc);
        }

        if (StringUtils.hasLength(userConfigDto.getPageSize())) {
            UserConfig uc = new UserConfig();
            uc.setUserId(userConfigDto.getUserId());
            uc.setParamName(UserConfigKeys.KEY_PAGE_SIZE);
            uc.setParamValue(userConfigDto.getPageSize());
            saveOrUpdate(uc);
        }
    }

    private void saveOrUpdate(UserConfig userConfig) {
        UserConfig uc = findByUserIdAndParamName(userConfig);
        if (uc == null) {
            dao.save("UserConfigMapper.insert", userConfig);
        } else {
            uc.setParamValue(userConfig.getParamValue());
            dao.update("UserConfigMapper.update", uc);
        }
    }

    /**
     * 按用户的id和参数名查找一个用户的设置
     *
     * @see UserConfigService#findByUserIdAndParamName(UserConfig)
     */
    @Override
    public UserConfig findByUserIdAndParamName(UserConfig userConfig) {
        return (UserConfig) dao.findForObject("UserConfigMapper.findByUserIdAndParamName", userConfig);
    }

    /**
     * 查找一个用户所有的设置
     *
     * @see UserConfigService#findAllConfigByUserId(int)
     */
    @Override
    public UserConfigDto findAllConfigByUserId(int userId) {
        List<UserConfig> ucs = dao.findForList("UserConfigMapper.findAllByUserId", userId, UserConfig.class);
        if (ucs.size() == 0) {
            return null;
        }
        UserConfigDto dto = new UserConfigDto();
        for (UserConfig uc : ucs) {
            if (uc.getParamName().equals(UserConfigKeys.KEY_PAGE_SIZE)) {
                dto.setPageSize(uc.getParamValue());
            }
            if (uc.getParamName().equals(UserConfigKeys.KEY_I18N)) {
                dto.setI18n(uc.getParamValue());
            }
        }
        if (!StringUtils.hasLength(dto.getI18n())) {
            dto.setI18n("zh-CN");
        }
        if (!StringUtils.hasLength(dto.getPageSize())) {
            dto.setPageSize("50");
        }
        dto.setUserId(userId);
        return dto;
    }

    @Override
    public String getUserPreferredLanguage(int userId) {
        UserConfigDto dto = findAllConfigByUserId(userId);
        if (dto == null) {
            return "default";
        }
        return dto.getI18n();
    }

}
